package com.therouter.apt

import javax.lang.model.element.Element

/**
 * 服务提供者项数据类
 * 
 * 存储一个服务提供者的信息，用于生成服务发现和依赖注入代码。
 * 支持两种服务提供方式：
 * 1. 类级别：通过构造函数创建服务实例 (isMethod = false)
 * 2. 方法级别：通过静态方法获取服务实例 (isMethod = true)
 * 
 * @property isMethod 是否是方法级别的服务提供者
 * @property element 元素对象（仅 KAPT 使用）
 * @property className 服务提供者类的完整限定名
 * @property returnType 服务返回类型的完整限定名
 * @property methodName 方法名（仅当 isMethod = true 时有效）
 * @property description 服务描述信息
 * @property params 构造函数或方法的参数类型列表
 */
class ServiceProviderItem(val isMethod: Boolean) : Comparable<ServiceProviderItem> {

    /** KAPT 元素对象（KSP 不使用） */
    var element: Element? = null

    /** 服务提供者类名 */
    var className = ""

    /** 服务返回类型 */
    var returnType = ""

    /** 方法名（仅方法级别服务） */
    var methodName = ""

    /** 服务描述 */
    var description = ""

    /** 参数类型列表 */
    var params = ArrayList<String>()

    /**
     * 生成服务提供者的字符串表示
     * 
     * 返回包含所有关键信息的字符串，用于调试和排序。
     * 
     * @return 包含所有属性的字符串
     */
    override fun toString(): String {
        return "ServiceProviderItem(isMethod=$isMethod, element=$element, className='$className', returnType='$returnType', methodName='$methodName', params=$params)"
    }

    /**
     * 比较两个服务提供者项的顺序
     * 
     * 基于 toString() 结果进行字典序比较，确保生成的代码顺序稳定。
     * 
     * @param other 要比较的另一个服务提供者项
     * @return 比较结果
     */
    override fun compareTo(other: ServiceProviderItem): Int {
        return toString().compareTo(other.toString())
    }
}